<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
    <title>JavaScript混淆加密工具</title>
    <link rel="stylesheet" href="/dist/bundle.css" media="screen" title="no title">
    <link rel="shortcut icon" href="/images/logo.png" type="image/x-icon" />
</head>
<style>
    pre,
    .CodeMirror pre,
    code {
        font-family: 'Liberation Mono', Monaco, Menlo, Consolas, 'Source Code Pro', 'Liberation Mono', 'Ubuntu Mono', 'Microsoft Yahei', '微软雅黑', Courier, 'Helvetica Neue', 'Lantinghei SC', STXihei, WenQuanYi, sans-serif;
    }

    .DropZone {
        position: relative;
        cursor: pointer;
    }

    .DropZone>div {
        color: #a1a1a1;
        padding: 0 10px;
        text-align: center;
        position: absolute;
        top: 50%;
        left: 0;
        right: 0;
        -webkit-transform: translateY(-50%);
        -moz-transform: translateY(-50%);
        -ms-transform: translateY(-50%);
        -o-transform: translateY(-50%);
        transform: translateY(-50%);
    }

    #mk-header {
        background: #fff url(/images/bg.jpg) fixed center center no-repeat;
        -webkit-background-size: cover;
        -moz-background-size: cover;
        -ms-background-size: cover;
        -o-background-size: cover;
        background-size: cover;
        color: #fff;
        width: 100% !important;
        padding: 50px 0;
        text-shadow: 0 0 18px #787878;
        margin-bottom: 15px;
    }

    #mk-header h1 {
        font-weight: normal;
        background: #000;
        display: inline-block;
        padding: 8px 18px;
        border-radius: 16px;
    }

    .mk-links {
        display: block;
        width: 100%;
        text-align: center;
    }

    .mk-links,
    .mk-links a {
        color: #fff !important;
    }
</style>

<body>

    <header class="ui container grid middle aligned stackable" id="mk-header">
        <div class="row">
            <div class="column twelve wide">
                <div class="ui basic segment">
                    <h1>JavaScript混淆加密工具</h1>
                    <p> 完全免费的在线 JavaScript 混淆加密工具，不会插入广告，无任何功能限制，强力保护你的代码不被窃取！ </p>
                    <p>JavaScript混淆加密工具
                        <a href="https://git.xinronghui.cn:3001/XRH/javascript-obfuscator-ui">源代码</a>
                    </p>
                </div>
            </div>
        </div>
        <div class="mk-links">
            <div class="ui breadcrumb center aligned"> <a class="section" href="#help"><i aria-hidden="true"
                        class="info icon"></i>使用帮助</a>
                <div class="divider"> / </div> <a class="section" href="#FAQ"><i aria-hidden="true"
                        class="question icon"></i>常见问题</a>
                <!-- <div class="divider"> / </div> <a class="section" href="/" target="_blank"><i aria-hidden="true"
                        class="home icon"></i>更多工具</a>
                <div class="divider"> / </div> <a class="section" href="https://support.qq.com/products/62183"
                    target="_blank" rel="nofollow"><i aria-hidden="true" class="comments icon"></i>意见反馈</a> -->
            </div>
        </div>
    </header>

    <div class="ui container grid middle aligned stackable">

        <div class="ui container grid">
            <div class="row">
                <div class="column">
                    <div class="" id="root">
                    </div>
                </div>
            </div>
        </div>

        <div class="row">
            <div class="column">
                <h3 id="help">使用帮助</h3>
                <table class="ui definition table" id="Options">
                    <tbody>
                        <tr>
                            <td class="collapsing">压缩成一行</td>
                            <td> 去除代码中的换行符。 </td>
                        </tr>
                        <tr>
                            <td class="collapsing">标识符混淆方式</td>
                            <td>
                                <p>设置变量名、函数名的混淆方式。</p> <strong>dictionary</strong>
                                <p>使用来自 <code>标识符字典</code> 中的名称</p> <strong>hexadecimal</strong>
                                <p>使用十六进制模式随机生成 (例如： <code>0xabc123</code>)</p> <strong>mangled</strong>
                                <p>使用简短的名称 (例如： <code>a</code>, <code>b</code>, <code>c</code>, 等等..)</p>
                            </td>
                        </tr>
                        <tr>
                            <td class="collapsing">标识符字典</td>
                            <td>
                                <p>设置标识符混淆的名称字典。</p>
                            </td>
                        </tr>
                        <tr>
                            <td class="collapsing">标识符前缀</td>
                            <td>
                                <p>设置混淆后的标识符使用特定的前缀</p>
                                <p>当混淆加载在同一页面上的多个文件时，请配置此选项。为每个文件使用不同的前缀有助于避免这些文件的全局标识符之间的冲突。</p>
                            </td>
                        </tr>
                        <tr>
                            <td class="collapsing">混淆全局变量</td>
                            <td>
                                <div class="ui tiny message">
                                    <p><i class="warning sign icon"></i> 开启此选项可能影响其它代码的运行，请谨慎使用！</p>
                                </div>
                                <p>开启后，将混淆全局变量与全局函数名。</p>
                            </td>
                        </tr>
                        <tr>
                            <td class="collapsing">自我保护</td>
                            <td>
                                <p>开启后将使加密后的代码无法被格式化。如果有人尝试格式化加密后的代码，将使代码无法正常运行。</p>
                                <p> <small>启用此选项后代码将被强制压缩成一行。</small> </p>
                            </td>
                        </tr>
                        <tr>
                            <td class="collapsing">控制流平坦化</td>
                            <td>
                                <div class="ui tiny message">
                                    <p><i class="warning sign icon"></i> 此选项非常影响性能，请按需开启！</p>
                                </div>
                                <p> 使代码控制流扁平化。控制流扁平化是一种阻碍程序理解的源代码结构转换。访问 <a
                                        href="https://github.com/javascript-obfuscator/javascript-obfuscator#controlflowflattening"
                                        target="_new">JavaScript's obfuscator GH page</a> 页面以了解其原理。 </p>
                                <table class="ui definition table">
                                    <tbody>
                                        <tr>
                                            <td class="collapsing">控制流平坦化阈值</td>
                                            <td>
                                                <p>调节范围：0~1，值越大，代码阅读难度越大，但输出的代码运行效率也相应的越低。可以按需调节。</p>
                                            </td>
                                        </tr>
                                    </tbody>
                                </table>
                            </td>
                        </tr>
                        <tr>
                            <td class="collapsing">死代码注入</td>
                            <td>
                                <div class="ui tiny message">
                                    <p><i class="warning sign icon"></i> 启用该选项将导致加密后的代码量变大。</p>
                                </div>
                                <p> 随机向代码中插入无意义的代码（不会被运行）使得代码的解密变得更困难。 </p>
                                <table class="ui definition table">
                                    <tbody>
                                        <tr>
                                            <td class="collapsing">死代码注入阈值</td>
                                            <td>
                                                <p>调节死代码注入的阈值（范围：0~1）</p>
                                            </td>
                                        </tr>
                                    </tbody>
                                </table>
                                <p> <small>启用该选项需要同时开启 <strong>字符串转换为数组</strong> 功能。</small> </p>
                            </td>
                        </tr>
                        <tr>
                            <td class="collapsing">分割字符串</td>
                            <td>
                                <div class="ui tiny message">
                                    <p><i class="warning sign icon"></i> 启用该选项将导致加密后的代码量变大。</p>
                                </div>
                                <p> 将文本字符串按照 <code>分割字符串块长度</code> 设定的值进行分割。 </p>
                                <table class="ui definition table">
                                    <tbody>
                                        <tr>
                                            <td class="collapsing">分割字符串块长度</td>
                                            <td>
                                                <p> 使用该选项来指定字符串分割后的块长度。 </p>
                                            </td>
                                        </tr>
                                    </tbody>
                                </table>
                            </td>
                        </tr>
                        <tr>
                            <td class="collapsing">字符串转换为数组</td>
                            <td>
                                <p> 去除代码中固定的字符串文本，并将其统一放在一个数组中。例如 <code>var m = "Hello World";</code> 中的 "Hello
                                    World"，将会被替换为一个函数调用，在运行时再检索此值。一个例子：<code>var m = _0xb0c3('0x1');</code> </p>
                                <table class="ui definition table">
                                    <tbody>
                                        <tr>
                                            <td class="collapsing">打乱字符串数组位置</td>
                                            <td>
                                                <p>将字符串数组放在一个随机的位置。如果您的原始源代码量很大，建议开启这个选项，能大大提升代码解密难度。</p>
                                            </td>
                                        </tr>
                                        <tr>
                                            <td class="collapsing">打乱字符串数组排序</td>
                                            <td>
                                                <p>随机排列字符串数组中的内容。</p>
                                            </td>
                                        </tr>
                                        <tr>
                                            <td class="collapsing">加密字符串数组</td>
                                            <td>
                                                <div class="ui tiny message">
                                                    <p><i class="warning sign icon"></i> 开启后将导致代码运行效率略微降低。</p>
                                                </div>
                                                <p> 使用 Base64 或 RC4 对字符串进行加密。RC4 加密方式加密后解密难度大，但加密后的代码运行效率比 Base64 加密方式低
                                                    30-35%。请按需选择。 </p>
                                            </td>
                                        </tr>
                                        <tr>
                                            <td class="collapsing">字符串转数组阈值</td>
                                            <td>
                                                <p> 您可以使用此设置来调整将字符串文字插入到字符串数组中的概率(从0到1)。
                                                    此设置在大型代码库中非常有用，因为对字符串数组函数的重复调用会降低代码速度。 </p>
                                            </td>
                                        </tr>
                                    </tbody>
                                </table>
                            </td>
                        </tr>
                        <tr>
                            <td class="collapsing">转换 Object Keys</td>
                            <td>
                                <p>转换 (混淆) object keys.</p>
                                <p>例如，将此代码 <code>var a = {enabled: true};</code> 混淆后，将会隐藏 <code>enabled</code> 对象键:
                                    <code>var a = {}; a[_0x2ae0[('0x0')] = true;</code>.</p>
                                <p> <small>该功能需要与 <strong>字符串转换为数组</strong> 配合使用。</small> </p>
                            </td>
                        </tr>
                        <tr>
                            <td class="collapsing">字符串转换为 Unicode 形式</td>
                            <td>
                                <p>将所有字符串转换为它们的 Unicode 形式。例如，字符串 <code>"Hello World!"</code> 将被转换为
                                    <code>"'\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x21"</code>. </p>
                                <p>这个太容易被解码了，没什么意义，不建议开启。而且开启后会增加代码大小。</p>
                            </td>
                        </tr>
                        <tr>
                            <td class="collapsing">禁用控制台输出</td>
                            <td> 通过重写为空函数禁用 <code>console.log</code>, <code>console.info</code>,
                                <code>console.error</code> 和 <code>console.warn</code> </td>
                        </tr>
                        <tr>
                            <td class="collapsing">禁止控制台调试</td>
                            <td>
                                <div class="ui tiny message">
                                    <p> <i class="warning sign icon"></i> 启用后，如果开启浏览器控制台，浏览器将被冻结。 </p>
                                </div>
                                <p> 这将使他人无法使用 <strong>控制台</strong> 调试工具进行代码调试 (支持 Google Chrome 和 Mozilla Firefox 浏览器)。
                                </p>
                                <table class="ui definition table">
                                    <tbody>
                                        <tr>
                                            <td class="collapsing">调试保护定时器</td>
                                            <td>
                                                <p> 开启后，会使用一个定时器来卡住控制台，使得控制台无法进行调试操作。 </p>
                                            </td>
                                        </tr>
                                    </tbody>
                                </table>
                            </td>
                        </tr>
                        <tr>
                            <td class="collapsing">白名单域名</td>
                            <td>
                                <p>默认不进行域名限定。如果添加了白名单域名，测限定加密后的代码只能在白名单域名下运行。</p> <strong>添加多个白名单域名或子域名的方法：</strong>
                                <p> 如果需要将 <strong>example.com</strong> 的子域名全部设置为白名单域名，添加 <code>.example.com</code> 即可。
                                </p>
                            </td>
                        </tr>
                        <tr>
                            <td class="collapsing">白名单标识符</td>
                            <td>
                                <p>白名单中的标识符不会被混淆。支持正则表达式。</p>
                                <p>例如，添加 <code>^someName</code> 则所有以 <strong>someName</strong> 开头的变量、函数名和函数参数都不会被混淆。</p>
                            </td>
                        </tr>
                        <tr>
                            <td class="collapsing">白名单字符串</td>
                            <td>
                                <p>同上。</p>
                            </td>
                        </tr>
                        <tr>
                            <td class="collapsing">Source Map</td>
                            <td>
                                <div class="ui tiny message">
                                    <p><i class="warning sign icon"></i> 请确保不要在生产环境中嵌入 Source Map，因为可以通过它找到源代码，导致加密失去意义。
                                    </p>
                                </div>
                                <p>Source maps 能帮助你调试 JavaScript 代码。如果非要在生产中进行调试，可以将单独的 Source maps
                                    文件上载到秘密位置，然后将浏览器指向该位置。</p> <strong>Inline Source Map</strong>
                                <p>将 Source maps 射嵌入到混淆代码的结果中。如果需要进行本地调试，会很有用。</p> <strong>Separate Source Map</strong>
                                <p>将 Source maps 一起生成一个单独的文件。这对于调试生产中的代码很有用，因为这使您可以将 Source maps
                                    上传到服务器上的秘密位置，然后设置浏览器指向该位置。</p>
                                <p>使用 <strong>Source Map Base URL</strong> 和 <strong>Source Map File Name</strong> 来自定义
                                    <code>sourceMappingURL</code> ，并附加到加密后代码的末尾。</p>
                                <p>例如，如果设置 <strong>Base URL</strong> 为 <code>"http://localhost:9000"</code> 同时设置
                                    <strong>Source Map 文件名</strong> 为 <code>"example"</code>, 最终会将
                                    <code>//# sourceMappingURL=http://localhost:9000/example.js.map</code> 附加到加密后代码的结尾。
                                </p>
                            </td>
                        </tr>
                        <tr>
                            <td class="collapsing">加密种子</td>
                            <td>
                                <p> 默认情况下 (种子设为“0”时), 每次加密同一段代码得到的结果都不一样（变量名及字符串打乱的顺序会不一样）。<br> 如果你需要同一段代码每次的加密结果保持一致，将
                                    <code>种子</code> 值设为一个固定的整数即可。 </p>
                            </td>
                        </tr>
                        <tr>
                            <td class="collapsing">运行环境</td>
                            <td>
                                <p>设置加密后的代码需要在哪里运行</p>
                                <ul>
                                    <li><strong>Browser</strong></li>
                                    <li><strong>Browser No Eval</strong></li>
                                    <li><strong>Node</strong></li>
                                </ul>
                                <div class="ui tiny message">
                                    <p><i class="warning sign icon"></i>当前 <code>browser</code> 和 <code>node</code>
                                        选项的处理方式是一样的。</p>
                                </div>
                            </td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>

        <div class="row">
            <div class="column">
                <h2 class="header" id="FAQ">常见问题</h2>

                <h4>加密后的代码无法运行？</h4>
                <p>本工具对原始 JavaScript 代码的规范性要求极高。建议采用闭包的写法，同时该加分号的地方加分号，该加大括号的地方加大括号。</br>
                    如果确保代码写得没问题，加密后仍有报错，请检查安全域名及变量混淆相关配置是否正确。</p>

                <h4>这个加密工具加密后的代码是绝对安全的吗？</h4>
                <p>这个工具只能用来混淆代码，使得代码变得不可读以及难以被还原。简而言之是只能防住大部分的小白，真正的大神还是能对代码进行逆向破解的。</br>
                    因为 JavaScript 需要在浏览器前端读取运行，因此也不可能有 100% 无法被破解的 JavaScript 加密。（如果有，也是骗人的……</p>

                <h4>为什么加密后的代码比原始代码大很多？</h4>
                <p>因为加密后的代码中插入了很多额外的代码，用来起到保护作用。</p>

                <h4>使用本工具加密后，再使用其它工具加密一次，是否会更安全？</h4>
                <p>千万别这么做。多个加密工具配合使用只会起反作用，同时还可能破坏代码的原始结构，导致代码无法正常运行。</p>

                <h4>你们会偷偷保存加密前的代码吗？</h4>
                <p>绝对不会！本工具全程在本地进行加密。如果仍觉得不放心，可以在工具载入完成后，断掉网再进行加密。</p>

                <h4>我的原始代码丢了，能从加密后的代码中找回吗？</h4>
                <p>找不回了。代码一旦加密，神仙也无法恢复出原始代码。因此请保存好原始代码。</p>

                <h4>这个工具可以用来加密 Node.js 源代码吗？</h4>
                <p>可以。</p>
            </div>
        </div>

    </div>


    <% if(htmlWebpackPlugin.files.js) { %>
        <script src="/dist/<%= htmlWebpackPlugin.files.js %>"></script>
        <% } %>

</body>

</html>